﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NGI_Entidades;
using NGI_Logica;
using NGI_Auxiliares;
using NGI_Mensaje;
using NGI_Enumerador;

namespace NGI_Sistema.Forms
{
    public partial class ABMUsuarios : Form
    {

        #region Propiedades
        private ResultadosOperaciones _resultadoUltimaOperacion = ResultadosOperaciones.NoExitoso;
        private CartelResultadoOperacion car;
        private TiposOperaciones _operacion = TiposOperaciones.Alta;
        private ArrayList _validaciones = new ArrayList();
        private Usuario _usuarioSeleccionado;

        public delegate void functioncall(Int32 Id);
        private event functioncall seleccionFunctionPointer;
        private event functioncall eliminacionFunctionPointer;

        public delegate void functioncall2();
        private event functioncall2 guardarFunctionPointer;

        private GrillaBusquedaEliminacion gre = new GrillaBusquedaEliminacion(TiposDatos.Usuario);
        #endregion Propiedades

        public ABMUsuarios()
        {
            InitializeComponent();
            this.AgregarValidaciones();
        }

        #region Receptor de grilla de búsqueda
        private void EliminarEntidad(Int32 Id)
        {
            if (!this.UsuarioEliminable(Id))
            {
                Mensaje.MostrarMensaje(TipoMensajes.UsuarioAEliminarConectado, TipoCarteles.Error, TipoBotones.OK);
                return;
            }

            try
            {
                this._operacion = TiposOperaciones.Baja;
                Usuarios.Eliminar(Id);

                ArrayList ListadoUsuarios = Usuarios.CargarTodos();
                gre.CargarDatos(ListadoUsuarios);
                this.pnlPersonalizado.Controls.Add(gre);
                this._resultadoUltimaOperacion = ResultadosOperaciones.Exitoso;
                this.LimpiarInputs();
                this.CartelesNegros();
            }
            catch (Exception Ex)
            {
                this._resultadoUltimaOperacion = ResultadosOperaciones.NoExitoso;
            }
            this.car.ElResultadoFue(this._resultadoUltimaOperacion);
            this.lblOperacion.Text = "Creando usuario.";
        }

        private void EntidadSeleccionada(Int32 Id)
        {
            this._operacion = TiposOperaciones.Modificacion;
            this._usuarioSeleccionado = Usuarios.TraerDatosDe(Id);
            this.LlenarCampos();
            this.CartelesNegros();

            this.lblOperacion.Text = "Modificando usuario: " + this._usuarioSeleccionado.Nombre + " " + this._usuarioSeleccionado.Apellido + ".";
        }
        #endregion Receptor de grilla de búsqueda


        #region Funciones privadas
        private void AgregarValidaciones()
        {
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtNombre, this.lblNombre, TiposValidaciones.Requerido));
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtEmail, this.lblEmail, TiposValidaciones.Requerido));
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtApellido, this.lblApellido, TiposValidaciones.Requerido));
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtNombreUsuario, this.lblNombreUsuario, TiposValidaciones.Requerido));
        }

        private void CargarRoles()
        {
            ArrayList ListadoRoles = Roles.CargarActivos();
            FuncionesFormulario.CargarCombo(this.cmbRol, ListadoRoles, "Nombre", "ID");
        }

        private void SeleccionarRol()
        {
            if (this._usuarioSeleccionado != null)
            {
                this.cmbRol.SelectedValue = this._usuarioSeleccionado.MiRol.ID;
            }
        }

        private Boolean UsuarioEliminable(Int32 Id)
        {
            Boolean UsuarioNoLogueado = Id != Program.SesionActiva.UsuarioLogueado.ID;
            //Boolean UsuarioTieneRolMayor = Program.SesionActiva.UsuarioLogueado.MiRol.Posicion < this._usuarioSeleccionado.MiRol.Posicion;
            return UsuarioNoLogueado;// && UsuarioTieneRolMayor;
        }

        private void LlenarCampos()
        {
            this.txtId.Text = this._usuarioSeleccionado.ID.ToString();
            this.txtNombre.Text = this._usuarioSeleccionado.Nombre;
            this.txtApellido.Text = this._usuarioSeleccionado.Apellido;
            this.txtNombreUsuario.Text = this._usuarioSeleccionado.NombreUsuario;
            this.txtEmail.Text = this._usuarioSeleccionado.Email;
            this.SeleccionarRol();
        }

        private void LimpiarInputs()
        {
            this.txtId.Text = "";
            this.txtNombre.Text = "";
            this.txtApellido.Text = "";
            this.txtNombreUsuario.Text = "";
            this.txtRepetirContrasena.Text = "";
            this.txtContrasena.Text = "";
            this.txtEmail.Text = "";
            this.cmbRol.SelectedIndex = 0;
        }

        private Boolean CamposValidos()
        {

            Boolean CamposValidos = false;

            if (this.txtContrasena.Text != this.txtRepetirContrasena.Text)
            {
                this.lblContrasenasNoCoinciden.Visible = true;
            }else{
                this.lblContrasenasNoCoinciden.Visible = false;
                CamposValidos = true;
            }

            if (this._operacion == TiposOperaciones.Alta)
            {
                if (this._validaciones.Count <= 4)
                {

                    this._validaciones.Add(Validacion.NuevaValidacion(this.txtContrasena, this.lblContrasena, TiposValidaciones.Requerido));
                    this._validaciones.Add(Validacion.NuevaValidacion(this.txtRepetirContrasena, this.lblRepetirContrasena, TiposValidaciones.Requerido));
                }
                else
                {
                    if (this.txtContrasena.Text.Length > 0 || this.txtRepetirContrasena.Text.Length > 0)
                    {
                        this._validaciones.RemoveAt(5);
                        this._validaciones.RemoveAt(4);
                    }
                }
            }

            return FuncionesFormulario.TodosLosCamposValidos(this._validaciones) && CamposValidos;
        }

        private void CartelesNegros()
        {
            this.lblApellido.ForeColor = Color.Black;
            this.lblContrasena.ForeColor = Color.Black;
            this.lblDescripcion.ForeColor = Color.Black;
            this.lblNombre.ForeColor = Color.Black;
            this.lblNombreUsuario.ForeColor = Color.Black;
            this.lblRepetirContrasena.ForeColor = Color.Black;
            this.lblEmail.ForeColor = Color.Black;
            this.lblContrasenasNoCoinciden.Visible = false;
        }

        private void CrearCartelDeResultados()
        {
            this.car = new CartelResultadoOperacion(pnlCartelResultadoOperacion.Height, pnlCartelResultadoOperacion.Width, (this.pnlCartelResultadoOperacion.Location.Y - pnlCartelResultadoOperacion.Height));
            pnlCartelResultadoOperacion.Controls.Add(car);
        }

        private void Operar()
        {
            Usuario unUsuario = new Usuario();

            Boolean CheckboxState = this.chkActivo.CheckState == CheckState.Checked ? true : false;

            try
            {
                switch (this._operacion)
                {
                    case TiposOperaciones.Alta:
                        unUsuario = Usuario.Nuevo(this.txtNombre.Text, this.txtApellido.Text, this.txtNombreUsuario.Text, this.txtEmail.Text, this.txtContrasena.Text, CheckboxState, Rol.DatosMinimos(Convert.ToInt32(cmbRol.SelectedValue)));
                        Usuarios.Crear(unUsuario, Program.SesionActiva.UsuarioLogueado.ID);
                        break;
                    case TiposOperaciones.Modificacion:
                        unUsuario = Usuario.UsuarioExistente(Convert.ToInt32(this.txtId.Text), this.txtNombre.Text, this.txtApellido.Text, this.txtNombreUsuario.Text, this.txtEmail.Text, CheckboxState, Rol.DatosMinimos(Convert.ToInt32(cmbRol.SelectedValue)));
                        Usuarios.Modificar(unUsuario, Program.SesionActiva.UsuarioLogueado.ID);
                        break;
                }

                if (this.txtContrasena.Text.Length > 0)
                {
                    unUsuario.Contrasena = this.txtContrasena.Text;
                    Usuarios.ModificarContrasena(unUsuario, Program.SesionActiva.UsuarioLogueado.ID);
                }


                this._resultadoUltimaOperacion = ResultadosOperaciones.Exitoso;

                ArrayList ListadoUsuarios = Usuarios.CargarTodos();
                gre.CargarDatos(ListadoUsuarios);

                this.LimpiarInputs();
            }
            catch (Exception Ex)
            {
                this._resultadoUltimaOperacion = ResultadosOperaciones.NoExitoso;
            }

            this.car.ElResultadoFue(this._resultadoUltimaOperacion);
        }
        #endregion Funciones privadas


        #region Eventos
        private void ABMUsuarios_Load(object sender, EventArgs e)
        {
            this.CrearCartelDeResultados();

            seleccionFunctionPointer += new functioncall(EntidadSeleccionada);
            eliminacionFunctionPointer += new functioncall(EliminarEntidad);
            gre.seleccionFunctionPointer = seleccionFunctionPointer;
            gre.eliminacionFunctionPointer = eliminacionFunctionPointer;

            guardarFunctionPointer += new functioncall2(Operar);

            this.lblOperacion.Text = "Creando usuario.";

            ArrayList ListadoUsuarios = Usuarios.CargarTodos();
            gre.CargarDatos(ListadoUsuarios);
            this.pnlPersonalizado.Controls.Add(gre);

            this.CargarRoles();
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            this.CartelesNegros();
            if (this.CamposValidos())
            {
                if (this.txtContrasena.Text.Length > 0 && this._operacion == TiposOperaciones.Modificacion)
                {
                    frmContrasenaActual frm = new frmContrasenaActual(this._usuarioSeleccionado.ID);
                    frm.Show();
                    frm.guardarFunctionPointer = this.guardarFunctionPointer;
                    return;
                }
                else
                {
                    this.Operar();
                }
                this.gre.DeseleccionarOpcion();
            }
            else
            {
                this.car.ElResultadoFue(ResultadosOperaciones.CamposMinimosNoCompletados);
            }
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            this.lblOperacion.Text = "Creando usuario.";
            this._operacion = TiposOperaciones.Alta;
            this.LimpiarInputs();
            this.CartelesNegros();
            this.gre.DeseleccionarOpcion();
        }
        #endregion Eventos

    }
}
